package com.example.android_day01.Dome

// 面向对象
fun mainConstructor() {
    // 显式 构造函数
    // constructor(var name: String, var age: Int)  添加了 name和 age2个属性，并且支持实例化的时候进行初始化
//    class Dog constructor(var name: String, var age: Int) {
    // class Dog constructor(var name: String, var age: Int) {
    class Dos(var name: String, var age: Int) {
        // 实例化时会自动执行，可以添加一些初始化的逻辑

        //    val e = Dog("哮天犬", 21000)
//    val f = Dog("       ".trim(), 3)
        init {
            println("我是 init 方法")
            // 传入布尔值 true 无事发生，false 把 {}中的信息 作为异常抛出
            // require(false) { "翻滚吧牛宝宝" }
            require(age <= 20) { "狗狗一般活不到20岁" }
            require(name.isNotEmpty()) { "姓名不能为空" }
        }
    }

    val d = Dos("柯基", 2)
}


fun secondConstructor() {
    class God(var name: String) {
        var age: Int = 0
        var color: String = ""

        //先执行
        init {
            println("我是 init 方法")
        }

        // 调用了 主构造函数，实例化时，会先执行 init，再执行自己，下面那个 以此类推
        constructor(name: String, age: Int) : this(name) {
            println("我是次构造函数1")
            this.age = age
        }

        constructor(name: String, age: Int, color: String) : this(name, age) {
            println("我是次构造函数2")
            this.color = color
        }
    }

    var f3 = God("小黄鱼", 10, "黄色")

}

// 入口函数
fun main() {
    // open 修饰类 可以继承
    // open 修饰方法可以重写
    open class Person(var name: String, var age: Number) {
        // 行为
        open fun eat() {
            println("吧唧吧唧~~")
        }
    }

    // 可以添加自己的属性
    class Student(name: String, age: Number, var grade: String) : Person(name, age) {
        override fun eat() {
            // 如果想继续沿用父类的逻辑，可以通过super调用
            // super.eat()
            println("我是学生，我吃的是鱼")
        }
    }

    val s = Student("王五", 18, "三年二班")
    println("${s.name},${s.age},${s.grade}")
    s.eat()
}
